import BaseObject from "../../移动商城改/base/baseObject.js";
import ProductListModel from "../model/productListModel.js";

/**
 * @description 商品列表控制器
 * @class {ProductListController}
 * @extends {BaseObject}
 * @author hhx
 * @date 2024-11-26 16:11
 * @version 0.1.2
 */
export default class ProductListController extends BaseObject {

    /**
     * @description 视图对象
     * @private
     * @type {HTMLElement}
     */
    _view = null;

    /**
     * @description 模型对象
     * @private
     * @type {ProductListModel}
     */
    _model = null;

    /**
     * @description 事件生产者
     * @private
     * @type {EventProduct}
     */
    _controllerEventProducer = null;

    /**
     * @description 商品列表控制器构造函数
     * @public
     * @constructor
     * @param props {object} 配置对象
     */
    constructor(props) {
        super(props);
    }

    /**
     * @description 实例化 商品列表控制器
     * @public
     * @static
     * @param props {object} 配置对象
     * @returns {ProductListController|*} 商品列表控制器
     */
    static instance(props = {}) {
        let instance = new ProductListController(props);
        instance.init(props);
        return instance;
    }


    //=========================== 成员属性 ===============================

    /**
     * @description 获取 基础视图
     * @member
     * @protected
     * @returns {HTMLElement|*} 基础显示模型
     */
    get view() {
        return this._view;
    }

    /**
     * @description 设置 基础视图
     * @member
     * @protected
     * @param value {HTMLElement|*} 基础显示模型
     */
    set view(value) {
        this._view = value;
    }

    /**
     * @description 获取 商品列表模型
     * @member
     * @protected
     * @returns {ProductListModel|*} 商品列表模型
     */
    get model() {
        return this._model;
    }

    /**
     * @description 设置 商品列表模型
     * @member
     * @protected
     * @param value {ProductListModel|*} 商品列表模型
     */
    set model(value) {
        this._model = value;
    }

    /**
     * @description 获取 生产者对象
     * @member
     * @protected
     * @returns {EventProduct|*} 生产者对象
     */
    get controllerEventProducer() {
        return this._controllerEventProducer;
    }

    /**
     * @description 设置 生产者对象
     * @member
     * @protected
     * @param value {ProductListModel|*} 生产者对象
     */
    set controllerEventProducer(value) {
        this._controllerEventProducer = value;
    }

    //=========================== 属性方法 ===============================

    /**
     * @description 获取 基本视图
     * @public
     * @returns {HTMLElement} 基本视图
     */
    getView() {
        return this.view;
    }

    /**
     * @description 设置 基本视图模型
     * @public
     * @param value {HTMLElement} 基本视图模型
     */
    setView(value) {
        this.view = value;
    }

    /**
     * @description 获取 商品列表模型
     * @public
     * @returns {ProductListModel} 商品列表模型
     */
    getModel() {
        return this.model;
    }

    /**
     * @description 设置 商品列表模型
     * @public
     * @param model {ProductListModel} 商品列表模型
     */
    setModel(model) {
        this.model = model;
    }

    /**
     * @description 获取 控制器生产者
     * @public
     * @returns {EventProduct} 控制器生产者
     */
    getControllerEventProducer() {
        return this.controllerEventProducer;
    }

    /**
     * @description 设置 控制器生产者
     * @public
     * @param value {EventProduct} 控制器生产者
     */
    setControllerEventProducer(value) {
        this.controllerEventProducer = value;
    }

    //=========================== 构建方法 ===============================

    /**
     * @description 重载方法
     * @protected
     * @override
     */
    init(props) {

        super.init(props);

        //构建视图
        this.initView();

        //构建数据模型
        this.initModel();

        //初始化事件订阅
        this.initEventSubscriber();

    }

    //=========================== 内部方法 ===============================

    /**
     * @description 初始化视图
     * @protected
     */
    initView() {

        let div = this.createElement('div');
        this.setView(div);
    }

    /**
     * @description 初始化模型
     * @protected
     */
    initModel() {

        let model = this.createProductListModel();
        this.setModel(model);
    }

    /**
     * @description 初始化事件订阅
     * @protected
     */
    initEventSubscriber() {
        this.subscriberAddProduct()
    }

    //=========================== 创建方法 ===============================

    /**
     * @description 创建元素
     * @protected
     * @param element {string} 创建元素
     * @return {HTMLElement} 元素
     */
    createElement(element) {
        return document.createElement(element);
    }

    /**
     * @description 创建商品列表模型
     * @protected
     * @return {ProductListModel} 商品列表模型
     */
    createProductListModel() {
        return ProductListModel.instance();
    }


    //=========================== 事件订阅 ===============================

    /**
     * @description 添加商品事件订阅
     * @protected
     */
    subscriberAddProduct() {
        this.model.subscriberAddProduct(this.handlerAddProduct.bind(this));
    }

    //=========================== 处理方法 ===============================

    /**
     * @description 添加商品处理函数
     * @protected
     * @param props {Array} 商品列表
     */
    handlerAddProduct(props) {
        console.log('添加商品', props);
    }

    //=========================== 接口方法 ===============================

    /**
     * @description 添加商品
     * @public
     * @param product {ProductModel} 商品
     */
    addProduct(product) {

        this.model.addProduct(this, product);

    }
}

